 /*******************************************************************************
  * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.wizards;

 import org.eclipse.ui.internal.dialogs.WizardCollectionElement;
 import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement;
 import org.eclipse.ui.wizards.IWizardCategory;
 import org.eclipse.ui.wizards.IWizardDescriptor;
 import org.eclipse.ui.wizards.IWizardRegistry;

 /**
  * Abstract base class for various workbench wizards.
  *
  * @since 3.1
  */
 public abstract class AbstractWizardRegistry implements IWizardRegistry {

     private boolean initialized = false;

     private WorkbenchWizardElement[] primaryWizards;

     private WizardCollectionElement wizardElements;

     /**
      * Create a new instance of this class.
      */
     public AbstractWizardRegistry() {
         super();
     }
     
     /**
      * Dispose of this registry.
      */
     public void dispose() {
         primaryWizards = null;
         wizardElements = null;
         initialized = false;
     }

     /**
      * Perform initialization of this registry. Should never be called by
      * implementations.
      */
     protected abstract void doInitialize();

     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.ui.wizards.IWizardRegistry#findCategory(java.lang.String)
      */
     public IWizardCategory findCategory(String id) {
         initialize();
         return wizardElements.findCategory(id);
     }

     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.ui.wizards.IWizardRegistry#findWizard(java.lang.String)
      */
     public IWizardDescriptor findWizard(String id) {
         initialize();
         return wizardElements.findWizard(id, true);
     }

     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.ui.wizards.IWizardRegistry#getPrimaryWizards()
      */
     public IWizardDescriptor[] getPrimaryWizards() {
         initialize();
         return primaryWizards;
     }

     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.ui.wizards.IWizardRegistry#getRootCategory()
      */
     public IWizardCategory getRootCategory() {
         initialize();
         return wizardElements;
     }

     /**
      * Return the wizard elements.
      *
      * @return the wizard elements
      */
     protected WizardCollectionElement getWizardElements() {
         initialize();
         return wizardElements;
     }

     /**
      * Read the contents of the registry if necessary.
      */
     protected final synchronized void initialize() {
         if (isInitialized()) {
             return;
         }

         initialized = true;
         doInitialize();
     }

     /**
      * Return whether the registry has been read.
      *
      * @return whether the registry has been read
      */
     private boolean isInitialized() {
         return initialized;
     }

     /**
      * Set the primary wizards.
      *
      * @param primaryWizards
      * the primary wizards
      */
     protected void setPrimaryWizards(WorkbenchWizardElement[] primaryWizards) {
         this.primaryWizards = primaryWizards;
     }

     /**
      * Set the wizard elements.
      *
      * @param wizardElements
      * the wizard elements
      */
     protected void setWizardElements(WizardCollectionElement wizardElements) {
         this.wizardElements = wizardElements;
     }
 }

